//package page.mainPage;
//
//import javafx.beans.property.SimpleStringProperty;
//import javafx.collections.FXCollections;
//import javafx.collections.ObservableList;
//import javafx.event.ActionEvent;
//import javafx.geometry.Point2D;
//import javafx.scene.Scene;
//import javafx.scene.control.Control;
//import javafx.scene.control.ListView;
//import javafx.scene.control.TextField;
//import javafx.scene.input.KeyCode;
//import javafx.stage.Popup;
//import javafx.stage.Window;
//
//import java.io.Serial;
//import java.util.ArrayList;
//import java.util.HashSet;
//import java.util.List;
//import java.util.function.Consumer;
//
//
///**
// * 自定提示控件
// */
//public class PopupBase {
//    private final static int LIST_MAX_SIZE = 6;
//    private final static int LIST_CELL_HEIGHT = 24;
//    private final Control control;
//    /**
//     * 用来存储显示 出来的信息列表
//     */
//    private final ObservableList<String> showCacheDataList = FXCollections.observableArrayList();
//    /**
//     * 监听输入框的内容
//     */
//    private final SimpleStringProperty inputContent = new SimpleStringProperty();
//    /**
//     * 用来存储缓存的信息列表 重写indexOf方法来获取匹配到的数据
//     */
//    private final List<String> cacheDataList = new ArrayList<String>() {
//        @Serial
//        private static final long serialVersionUID = 281687373227150590L;
//
//        // 输入内容时进行筛选
//        @Override
//        public int indexOf(Object searchContext) {
//            showCacheDataList.clear();
//            if (null == searchContext || searchContext.toString().equals("")) {
//                return -1;
//            }
//            for (String s : cacheDataList) {
//                if (s.toLowerCase().contains(searchContext.toString().toLowerCase())) {
//                    showCacheDataList.add(s);
//                }
//            }
//            return -1;
//        }
//    };
//    /**
//     * 输入内容后显示的pop
//     */
//    private final Popup popShowList = new Popup();
//    /**
//     * 输入内容后显示的提示信息列表
//     */
//    private final ListView<String> autoTipList = new ListView<>();
//
//    PopupBase(Control control, List<String> cacheDataList, Consumer<String> selectedFunction) {
//        if (null == control) {
//            throw new RuntimeException("control 不能为空");
//        }
//        this.control = control;
//        if (null != cacheDataList) {
//            this.cacheDataList.addAll(cacheDataList);
//        }
//        configure();
//        confListnenr(selectedFunction);
//    }
//
//    public void setCacheDataList(List<String> cacheDataList) {
//        this.cacheDataList.clear();
//        this.cacheDataList.addAll(cacheDataList);
//    }
//
//    /**
//     * <p>
//     * 添加监听事件
//     * </p>
//     */
//    private void confListnenr(Consumer<String> selectedFunction) {
//        control.textProperty().bindBidirectional(inputContent);
//        // 输入框获取焦点时，展示提示内容
//        control.focusedProperty().addListener((observableValue, aBoolean, forcused) -> {
//            if (forcused) {
//                showCacheDataList.clear();
//                showCacheDataList.addAll(cacheDataList);
//                showTipPop();
//            }
//        });
//
//        control.addEventFilter(ActionEvent.ACTION, event -> {
//            cacheDataList.add(inputContent.get()); // setOnAction事件后才会生效，此处是点击按钮时将文本框中数据存入到cacheDataList中
//            removeDuplicate(cacheDataList);
//        });
//
//        inputContent.addListener((obs, oldValue, newValue) -> {
//            configureListContext(newValue);    //当文本框中内容发生变化时会触发此事件，对文本框中内容进行匹配
//        });
//
//        autoTipList.setOnMouseClicked(event -> selectedItem(selectedFunction));
//
//        autoTipList.setOnKeyPressed(event -> {
//            if (event.getCode() == KeyCode.ENTER) {
//                selectedItem(selectedFunction);
//            }
//        });
//    }
//
//    /**
//     * <p>
//     * 获取选中的list内容到输入框
//     * </p>
//     */
//    private void selectedItem(Consumer<String> selectedFunction) {
//        String input = autoTipList.getSelectionModel().getSelectedItem();
//        inputContent.set(input);
//        selectedFunction.accept(input);
//        control.end();
//        popShowList.hide();
//    }
//
//    /**
//     * <p>
//     * 根据输入的内容来配置提示信息
//     * </p>
//     */
//    private void configureListContext(String tipContent) {
//        cacheDataList.indexOf(tipContent);
//        if (!showCacheDataList.isEmpty()) {
//            showTipPop();
//        } else {
//            popShowList.hide();
//        }
//    }
//
//    /**
//     * <p>
//     * 配置组建
//     * </p>
//     */
//    private void configure() {
//        popShowList.setAutoHide(true);
//        popShowList.getContent().add(autoTipList);
//        autoTipList.setItems(showCacheDataList);
//    }
//
//    public void removeDuplicate(List<String> cacheDataList2) {
//        HashSet<String> h = new HashSet<String>(cacheDataList2);
//        cacheDataList2.clear();
//        cacheDataList2.addAll(h);
//    }
//
//    /**
//     * <p>
//     * 获取pop显示的窗口
//     * </p>
//     */
//    public final Window getWindow() {
//        // 窗口被删除
//        if (getScene() == null) {
//            return null;
//        }
//        return getScene().getWindow();
//    }
//
//    /**
//     * <p>
//     * 获取textField Scene
//     * </p>
//     */
//    public final Scene getScene() {
//        return control.getScene();
//    }
//
//    /**
//     * <p>
//     * 显示pop
//     * </p>
//     */
//    public final void showTipPop() {
//        autoTipList.setPrefWidth(control.getWidth() - 3);
//        if (showCacheDataList.size() < LIST_MAX_SIZE) {
//            autoTipList.setPrefHeight(showCacheDataList.size() * LIST_CELL_HEIGHT + 3);
//        } else {
//            autoTipList.setPrefHeight(LIST_MAX_SIZE * LIST_CELL_HEIGHT + 3);
//        }
//        Window window = getWindow();
//        // 窗口被突然移除了，比如打开一个新窗口，旧窗口不在了
//        if (window == null) {
//            return;
//        }
//        Scene scene = getScene();
//        Point2D fieldPosition = control.localToScene(0, 0);
//        // x 与 textfield 位置一致，y 在 textfield 下面
//        popShowList.show(window, window.getX() + fieldPosition.getX() + scene.getX(), window.getY() + fieldPosition.getY() + scene.getY() + control.getHeight());
//        autoTipList.getSelectionModel().clearSelection();
//        autoTipList.getFocusModel().focus(-1);
//    }
//
//
//}
//
